import random, logging

from django.shortcuts import render

# Create your views here.
from . import constants
from django_redis import get_redis_connection
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from libs.yuntongxun.sms import CCP
# from celery_tasks.tasks.sms import send_sms_code
from celery_tasks.sms.tasks import send_sms_code




# 创建log日志实例

logger = logging.getLogger("django")


class SMSCodeView(APIView):
    """
        发送短信验证码
        传入参数：
        mobile, image_code_id, text

    """

    def get(self, request, mobile):
        # 注册业务接口分析
        #
        # 在用户注册中，需要实现以下接口：
        #
        # 短信验证码
        # 用户名判断是否存在
        # 手机号判断是否存在
        # 注册保存用户数据
        # 提示
        #
        # 短信验证码考虑到后续可能会在其他业务中也用到，因此我们将验证码独立
        # 创建一个新应用verifications，在此应用中实现短信验证码



        # 创建链接到 redis对象verify_codes
        redis_conn = get_redis_connection("verify_codes")

        # 判断验证码是否存在
        # 查询redis数据库是否存在数据如果不存在返回noll
        send_flag = redis_conn.get("send_flag_%s" % mobile)

        if send_flag:
            return Response({"message": "发送短信过于频繁"}, status=status.HTTP_404_NOT_FOUND)
        # 生成随机验证码
        sms_code = "%6d" % random.randint(0, 999999)
        print(sms_code)
        try:
            # 发送异步任务必须调用celery
            # send_sms_code.delay(mobile, sms_code)
            pass
        except Exception as e:
            # 发送短信失败记录日志
            logger.error("发送短信失败！%s,%s" % (mobile, e))
            return Response({"发送短信失败！%s,%s"},status=status.HTTP_502_BAD_GATEWAY)

        # 发送短信验证码
        # ccp = CCP()
        # ccp.send_template_sms(mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES // 60],
        #                       constants.SEND_SMS_TEMPLATE_ID)

        # 存储到redis数据库
        # 验证码
        # redis_conn.setex("sms_%s" % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
        # 存储有效期
        # redis_conn.setex("send_flag%s" % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
        # 优化redis数据库提交使用管道pipeline
        p1 = redis_conn.pipeline()
        p1.setex("sms_%s" % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
        p1.setex("send_flag%s" % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
        # 执行
        p1.execute()
        return Response({"message": "ok"})
